<?php
/**
 * Created by PhpStorm.
 * User: tiany
 * Date: 2018/1/8
 * Time: 19:47
 */
namespace app\mall\controller;
use Workerman\Worker; //引入Worker类
use PHPSocketIO\SocketIO;//引入SocketIO类
class Orderremind
{
    public function index(){
        $uid = '10000';
        // 全局数组保存uid在线数据
        $uidConnectionMap = array();
        // 记录最后一次广播的在线用户数
        $last_online_count = 0;
        // 记录最后一次广播的在线页面数
        $last_online_page_count = 0;
        //根据官方手册说明：脚本中引用vendor中的autoload.php实现SocketIO相关类的加载
        //所以下面这句代码必须
        require_once VENDOR_PATH.'socket/autoload.php';
        // 创建socket.io服务端，监听端口
        $io = new SocketIO('http://127.0.0.1:81');
        // 当有客户端连接时打印一行文字
        $io->on('connection', function($socket){
            // 当客户端发来登录事件时触发
            $socket->on('login', function ($uid)use($socket){
                global $uidConnectionMap, $last_online_count, $last_online_page_count;
                // 已经登录过了
                if(isset($socket->uid)){
                    return;
                }
                // 更新对应uid的在线数据
                $uid = (string)$uid;
                if(!isset($uidConnectionMap[$uid]))
                {
                    $uidConnectionMap[$uid] = 0;
                }
                // 这个uid有++$uidConnectionMap[$uid]个socket连接
                ++$uidConnectionMap[$uid];
                // 将这个连接加入到uid分组，方便针对uid推送数据
                $socket->join($uid);
                $socket->uid = $uid;
                // 更新这个socket对应页面的在线数据
                $socket->emit('update_online_count', "当前<b>{$last_online_count}</b>人在线，共打开<b>{$last_online_page_count}</b>个页面");
            });

            // 当客户端断开连接是触发（一般是关闭网页或者跳转刷新导致）
            $socket->on('disconnect', function () use($socket) {
                if(!isset($socket->uid))
                {
                    return;
                }
                global $uidConnectionMap, $io;
                // 将uid的在线socket数减一
                if(--$uidConnectionMap[$socket->uid] <= 0)
                {
                    unset($uidConnectionMap[$socket->uid]);
                }
            });
        });

// 监听一个http端口，通过http协议访问这个端口可以向特定客户端推送数据(url类似http://ip:端口号?uid=xxx&msg=xxxx)
        $io->on('workerStart', function()use($io) {
            $uid = $_GET['uid'];
            $inner_http_worker = new Worker('http://127.0.0.1:80');
            $inner_http_worker->onMessage = function($http_connection, $data)use($io){
                if(!isset($_GET['msg'])) {
                    return $http_connection->send('fail, $_GET["msg"] not found');
                }
                $io->to($uid)->emit('new_msg', $_GET['msg']);
                $http_connection->send('ok');
            };
            $inner_http_worker->listen();
        });

        Worker::runAll();
    }
}